package net.zjitc.linearlist.impl;


import net.zjitc.linearlist.MyLinearList;

import java.lang.reflect.Array;

/**
 * Created by Administrator on 2017/3/2.
 */
public class SeqList<E> implements MyLinearList<E> {
    /*定义一个数组*/
    private E[] date;
    /*定义一个索引*/
    private  int size;
    /*表示数组的长度  date.length*/
    private int maxSize;
    /*初始化*/

    /**
     *
     * @param type
     * @param maxSize
     */
    public SeqList(Class<E> type,int maxSize){
        /*让数组工具帮我们new,给个类名和长度*/
        date=(E[])Array.newInstance(type,maxSize);
        size=0;
        this.maxSize=maxSize;
    }

    /**
     * 在顺序表末尾添加一个元素
     * @param e
     */
    @Override
    public void add(E e) {
        /*判断空间是否够用*/
        if (size>=maxSize){
            throw new RuntimeException("越界");
        }
        /*插入元素*/
        date[size]=e;
        size++;

    }

    /**
     * 插入元素，将元素添加在顺序指定的索引位置i处
     * @param i
     * @param e
     * @return
     */
    @Override
    public boolean add(int i, E e) {
    if (i<0|| i>size)
        throw new IndexOutOfBoundsException("Index:"+i+",Size:"+size);
    /*判断顺序表是否已满*/
    if (!isFull()){
        /*要插入的元素的位置，并且要插入元素的位置的当前元素覆盖下一个元素*/
    for (int j=size-1;j>=i;j--){
        date[j+1]=date[j];
    }
    /*在i处插入元素*/
            date[i]=e;
            size++;
        return  true;
    }else
        return false;
    }

    /**
     * 删除元素，删除顺序表的第i个数据元素
     * @param i
     * @return
     */
    @Override
    public E remove(int i) {
        rangCheck(i);
        /*判断顺序表是否为空*/
        if (!isEmpty()){
            /*要删除的元素*/
            E oldValue =date[i]
                    /*要删除的元素的位置，并且要删除元素的位置由下一个元素覆盖*/;
            for (int j=i;j<size-1;j++){
                date[j]=date[j+1];
            }
            /*删除最后一个元素*/
            date[--size]=null;
            return oldValue;

        }else
            return null;
    }

    /**
     * 判断给定的索引位置i是否在指定的范围，如果不在，抛出索引越界异常
     * @param i
     */

    private void rangCheck(int i) {
        if (i<0 ||i>=size)
            throw new IndexOutOfBoundsException("Index:"+i+",Size:"+size);
    }

    /**
     * 定位元素，返回对象item在顺序表中首先出现的索引位置，不逊在item，则返回-1
     * @param e
     * @return
     */
    @Override
    public int indexOf(E e) {
        if (e ==null){
            for (int i=0;i<size;i++)
                if (date[i]==null)
                    return i;
        }else {
            for (int i=0;i<size;i++)
                if (e.equals(date[i]))
                    return i;
        }
        return -1;
    }

    /**
     * 取表元素，返回顺序表中索引位置i处的数据元素
     * @param i
     * @return
     */

    @Override
    public E get(int i) {
        rangCheck(i);
        return date[i];
    }

    @Override
    public void edit(int i, E e) {

    }

    /**
     * 顺序表长度
     * @return
     */

    @Override
    public int getSize() {
            return size;
    }

    /**
     * 清空顺序表
     */

    @Override
    public void clear() {
        for (int i = 0; i <size ; i++) {
            date[i]=null;
            size=0;
        }
    }

    /**
     * 判断顺序表是否为空
     * @return
     */

    @Override
    public boolean isEmpty()
    {
        return size==0;
    }

    /**
     * 判断顺序表是否已满
     * @return
     */

    public boolean isFull() {
        if (size==maxSize){
            return false;
        }else {
            return true;
        }

    }
}
